Skip to main content

12 UART

Universal Synchronous/Asynchronous Receiver/Transmitter 通用同步/异步收发器

up的视频讲解: https://space.bilibili.com/1455872040

1 ✨UART简介​

图片

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器

  • UART可以是USART外设的一种模式

  • 也可以是直接将USART从硬件上进行裁剪而得到的的外设

  • 这个前面带A的就是异步的意思

图片

接下来我们来把STM32里面 这些与外部设备通信的外设都来分类一下

  • 串行和并行

    • 一类是串行发送数据的 也叫串口通信 UART IIC 以及SPI USB CAN这些都属于串口通信的外设

    • 另一类是并行发送数据的有 FSMC

  • ​在串口通信里面又可以分为 同步 和 异步 这两种模式

    • 其中UART USB CAN这些都是串行异步通信

    • 而SPI IIC以及USART的同步模式就属于串行同步通信

​- 其中在异步通信里面又可以通过电平标准简单分一分

  • UART采用的是TTL电平标准
  • 而USB和CAN则采用的是差分电平标准

2 🎞️ UART通信协议​

2.1 物理连接​

图片

UART在同一时刻 通信双方都可以收发的叫做全双工通信的工作方式

​- 半双工通信往往收发都在一条线上 所以同一时刻只能由其中一个发

​- 而单工通信则只能由发送方发给接收方

图片

UART属于串行异步通信的一种方式

  • 同步就是双方通过一条专属的时钟线进行 时钟的同步

  • 而异步通信则采用的是双方各自的时钟 通过提前约定波特率也就是通信的速率 来进行时钟的同步

​约定波特率本质 是约定UART外设的时钟频率 因为UART的收发都是以时钟为工作基准的

2.2 波特率​

图片
  • 在UART通信中 我们所使用的码元就是低电平0和高电平1

  • 所以对二进制码元取log2就是1bit 那么这个时候波特率也就等于比特率

  • ​所以说我们通常用的波特率 115200bit/s 9600bit/s它们的单位直接就用bit每秒来表示了

2.3 电平标准​

图片
  • TTL电平规定
    • 当电压大于等于2.4伏的时候就判定为1
    • 小于等于0.4伏的时候就判定为0

​- 而USB差分电平标准是

  • 当D正大于等于2.8伏且D负小于等于0.3伏的时候 判定为1
  • 当D负小于等于0.3伏且D正大于2.8伏的时候判定为0
3.3v TTL 和 5v TTL
  • 3.3V TTL(STM32 等主流) 逻辑 1:≈3.3V 逻辑 0:≈0V

  • 5V TTL(51等) 逻辑 1:+2.4V ~ +5V 逻辑 0:0V ~ +0.8V

2.4 数据帧​

图片

串口一个数据帧 = 1 起始位 + 8 数据位 + + (1 奇偶校验位) + 1 停止位

  • 起始位:标志一个数据帧的开始,固定为低电平。(空闲状态为高电平)

  • 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行(数据从低位到高位发送)

  • (校验位):用于数据验证,根据数据位计算得来,串口用的是奇偶校验法(无校验,奇校验,偶校验)

    • 奇校验:如果传输的数据是0000 1111 共4个1,是偶数个,那么校验位就需要在补一个1,变成0000 1111 1 保证1的个数为奇数
    • 偶校验:如果传输的数据是0000 1111 共4个1,是奇数个,那么校验位就需要在补一个0,变成0000 1111 0 保证1的个数为偶数
  • 停止位:用于数据帧间隔,固定为高电平,时长可以配置为1bit时间或者1.5以及2bit时间

UART发送和接收

​对于发送而言每来

  • 一个时钟时钟脉冲 就UART外设就对应发送1bit的数据

而对于接收而言

  • 它会将这个频率 提高到16倍 也就是说每一个bit时间里会进行 16次采样 而只取 中间三次的值作为判定

3 🌐USART外设结构​

图片

3.1 收发通路​

图片
  • RSR Receive Shift register(接收移位寄存器): 把串行比特流数据,按波特率采样,拼成完整的字节,再送到 RDR

  • RDR Receive Data Register(接收数据寄存器):接收移位寄存器拼好的字节,先存在这里,再由CPU/DMA 读取

先看到 接收通路

  • 由RX引脚输入进来的比特流 会经过16倍的过采样 然后到这个接收移位寄存器

  • 这个移位寄存器具体由下方的接收控制器控制 接收控制器会根据配置的参数 将数据帧中的数据位 拿出来

  • 然后并行拷贝到RDR寄存器 拷贝完成之后会将对应标志位RXNE置为1 此时 CPU就可以读取RDR中的数据 并重新将RXNE置为0

图片
  • TDR Transmit Data Register(发送数据寄存器):CPU/DMA 将要发送的数据并行写入这里。

  • TSR Transmit Shift register(发送移位寄存器): 把并行数据转成串行比特流,然后一位一位按波特率从 TX 引脚发出去

对于 发送通路

  • CPU会将发送的数据写到TDR

  • 然后TDR就会将数据并行拷贝到发送移位寄存器

  • 拷贝完成之后 会将对应的标志位TXE置为1

  • 最后就会按下方配置的起始位 停止位 校验位进行拼接 每来一个时钟脉冲就向TX引脚发送一位

3.2 参数配置​

图片
  • CR1 Control Register 1 (控制寄存器1): USART 模块使能, 发送 / 接收使能, 数据位宽(8/9 位),奇偶校验使能, 中断使能

  • CR2 Control Register 2 (控制寄存器2): 帧格式与同步模式控制, STOP:停止位配置(1/2 位)

  • CR3 Control Register 3 (控制寄存器3): 发送 / 接收 DMA 使能, RTS/CTS 硬件流控使能, 红外模式配置, 半双工模式使能

  • SR Status Register(状态寄存器):

    • 数据写入 TDR → TXE 标志置 1 → 数据自动进入发送移位寄存器 → 按波特率从 TX 引脚发出
    • 数据写入 RDR → RXNE 标志置 1 → CPU 读取数据

这里的参数配置寄存器

  • CR1中的这几位就是配置数据位的位数以及校验位

  • CR2中的STOP就是配置停止位的长度

  • 左下角的 RXNE和TXE 掌管的就是对应的标志位

3.3 波特率生成​

图片
  • BRR Baud Rate Register(波特率配置寄存器):用来配置波特率的分频系数, 最终生成发送和接收的采样时钟

波特率生成时钟

  • 由RCC输入 进来的PCLK时钟 会通过这个可编程数字分频器

  • 生成 16倍波特率的时钟给到接收部分 再通过 16分频后给到发送部分

  • ​这个可编程数字分频器具体怎么分频 就由右边的波特率生成器去控制

✅一帧数据需要多长时间​

115200、8N1表示每个字节有1起始位、8数据位和1停止位,共10位,所以理想有效速率是11520 byte/s。100个字节至少约8.68 ms,不含软件等待和上位机调度。

UART只发送位流,不会自动知道数据是温度、字符串还是数组。ASCII中A是0x41(二进制01000001),字符6是0x36(二进制00110110),整数6直接发一个字节则是0x06。

自定义协议需要约定长度、字节序、帧头与校验。接收到一次回调不代表收到一条完整业务消息;长消息可分多次到达,多条消息也可连续到达。